module S_M_top
(
    input           I_clk           , // 系统50MHz时钟
    input           I_rst_n         , // 系统全局复位
    input   [6:0]   I_dev_addr      , // IIC设备的物理地址
	 input   [7:0]   I_word_addr     , // IIC设备的字地址，即我们想操作的IIC的内部地址
	 input   [7:0]   I_write_data    , // 
	 
	 output          O_done_flag     ,
	 output  [7:0]   O_read_data     , // 从IIC设备的字地址读出来的数据 
    output          O_M_scl         , // 主机生成的时钟
	 
	 output  [7:0]   S_read_data_reg , /////////////
	 output          I_M_sda         , // 主机接收从机发出的sda线
	 output          O_M_sda           // 主机发出的sda线
);

wire              M_scl           ; // 主向从输出时钟线
wire              O_sda           ; // 主向从输出SDA线
wire              I_sda           ; // 主接收从输入SDA线             
wire     [7:0]    W_data          ;
wire     [7:0]    W_read_data_reg ;
wire              W_done_flag_1     ;
wire              W_done_flag_2     ;

// 监控信号
assign    O_done_flag = (W_done_flag_1 == W_done_flag_2)? W_done_flag_1:1'b0 ;
assign    O_read_data = W_data      ;
assign    O_M_scl     = M_scl       ;
assign    I_M_sda     = I_sda       ;
assign    O_M_sda     = O_sda       ;
assign    S_read_data_reg = W_read_data_reg ;
//

M_receive Mreceive
(
    .I_clk           (I_clk            ), // 系统50MHz时钟
    .I_rst_n         (I_rst_n          ), // 系统全局复位
    .I_iic_recv_en   (1'b1             ), // 接收使能位，高电平有效
    
    .I_dev_addr      (I_dev_addr       ), // IIC设备的物理地址
    .I_word_addr     (I_word_addr      ), // IIC设备的字地址，即我们想操作的IIC的内部地址
    .O_read_data     (W_data           ), // 从IIC设备的字地址读出来的数据   
    .O_done_flag     (W_done_flag_1      ), // 读或写IIC设备结束标志位
    
    .O_scl           (M_scl            ), // IIC总线的串行时钟线
	 .O_sda           (O_sda            ), // IIC总线的主向从sda数据线
	 .I_sda           (I_sda            )  // IIC总线的从向主sda数据线
);


S_send Ssend
(
    .I_clk           (M_scl            ), // 系统全局复位
    .I_rst_n         (I_rst_n          ), // 系统全局复位
    .I_iic_send_en   (1'b1             ), // 发送使能位，高电平有效
    
	 .I_dev_addr      (I_dev_addr       ), // 从设备的物理地址
    .I_word_addr     (I_word_addr      ), // 从设备的字地址
    .I_write_data    (I_write_data     ), // 往IIC设备的字地址写入的数据 
    .O_done_flag     (W_done_flag_2    ), // 读或写IIC设备结束标志位
    
    .S_read_data_reg (W_read_data_reg  ),  // 测试从机接收数据
	 .O_sda           (I_sda            ),  // IIC总线的从向主sda数据线
	 .I_sda           (O_sda            )   // IIC总线的主向从sda数据线
);
endmodule
